home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 2
/
United Public Domain Gold 2.iso
/
education
/
pe023.dms
/
pe023.adf
/
ALGORHYTHMS
/
SOURCE
/
MUSICSERIAL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-10-05
|
6KB
|
236 lines
/* musicserial.c */
/* Copyright 1990 Thomas E. Janzen All Rights Reserved */
/*
** FACILITY:
**
** AlgoRhythms music improviser on Commodore (TM) Amiga (TM)
** compiled with Lattice (TM) C 5.05
**
** ABSTRACT:
**
** Algorhythms improvises music over the MIDI serial port.
**
** AUTHORS: Thomas E. Janzen
**
** CREATION DATE: 26-MAR-1990
**
** MODIFICATION HISTORY:
** DATE NAME DESCRIPTION
**--
*/
#include "exec/types.h"
#include "exec/nodes.h"
#include "exec/lists.h"
#include "exec/ports.h"
#include "exec/libraries.h"
#include "exec/devices.h"
#include "devices/serial.h"
#include "exec/io.h"
#include "intuition/intuition.h"
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/exec.h>
#include <proto/mathffp.h>
#include <proto/intuition.h>
#define NOTEON (0x90)
#define NOTEOFF (0x80)
#define MIDIADDRESS (0x00)
#define NOTEONCMD (0x90)
#define NOTEOFFCMD (0x80)
#define STARTFUNCT (0)
#define STOPFUNCT (1)
#define CLOCKFUNCT (2)
#define CONTFUNCT (3)
#define START 0xFA
#define STOP 0xFC
#define CONTINUE 0xFB
#define TIMINGCLOCK 0xF8
extern struct Window *w;
extern int fubar;
int midi_addr=0;
extern int quit;
int Response;
#include "AlgoRhythms.h"
extern struct GfxBase *GfxBase;
extern struct IntuitionBase *IntuitionBase;
extern struct DOSBase *DOSBase;
extern struct MathBase *MathBase;
struct IOExtSer *IORser;
struct MsgPort *port;
extern struct IORequest *CreateExtIO();
/* Devices prototypes */
extern void DeletePort(struct MsgPort *);
const char QuitStr[]="Quit";
const char SerErrStr[]="Serial Device Error";
const char PrtErrStr[]="Port Error";
const char IOErrStr[]="Create ExtIO Error";
const char DevErrStr[]="Serial Device Error";
const char PrmErrStr[]="Set Parm Error";
const char WrtErrStr[]="Serial.device write error";
struct IntuiText QuitTxt={2,1,JAM1,5,4,NULL,QuitStr,NULL};
void SendFunction(int Function);
char playbuffer[4]; /* MIDI note message buffer */
int SetParams(struct IOExtSer *io,unsigned long rbuf_len,
unsigned char rlen,unsigned char wlen,unsigned long brk,
unsigned long baud,unsigned char sf,
unsigned long ta0,unsigned long ta1)
{
struct IntuiText SerErrTxt={2,1,JAM1,5,15,NULL,SerErrStr,NULL};
int error;
io->io_ReadLen =rlen;
io->io_BrkTime =brk; /*length of break timej (irrelevant)*/
io->io_Baud =baud;
io->io_WriteLen =wlen;
io->io_StopBits =0x01;
io->io_RBufLen =rbuf_len;
io->io_SerFlags =(1<<SERB_RAD_BOOGIE);
io->IOSer.io_Command=SDCMD_SETPARAMS;
io->io_TermArray.TermArray0=ta0;
io->io_TermArray.TermArray1=ta1;
if((error=DoIO(io)) !=0) {
quit=TRUE;
fubar=TRUE;
Response=AutoRequest(w,&SerErrTxt,
&QuitTxt,&QuitTxt,0L,0L,300L,60L);
}
return(error);
}
void Open_MIDI_Port(void)
{
struct IntuiText PrtErrTxt={2,1,JAM1,5,15,NULL,PrtErrStr,NULL};
struct IntuiText IOErrTxt={2,1,JAM1,5,15,NULL,IOErrStr,NULL};
struct IntuiText DevErrTxt={2,1,JAM1,5,15,NULL,DevErrStr,NULL};
struct IntuiText PrmErrTxt={2,1,JAM1,5,15,NULL,PrmErrStr,NULL};
int error;
unsigned long rbl = 512; /*read buffer length*/
unsigned long brk = 750000;
/* length of break in usec, usu. 750000 */
unsigned long baud= 31250; /*baud rate 31.25k*/
unsigned long t0 = 0x51040303; /*termination characters*/
unsigned long t1 = 0x03030303;
unsigned char rwl = 0x08; /*bits per read char */
unsigned char wwl = 0x08;/*bits per write char */
unsigned char sf = 0x00; /*serial flags cf D-124 in libs devices*/
/* Try to get to the serial device. */
/* page 396 of Libraries and Devices was the example*/
port=CreatePort(SERIALNAME,0);
if(port==NULL){
quit=TRUE;
fubar=TRUE;
Response=AutoRequest(w,&PrtErrTxt,
&QuitTxt,&QuitTxt,0L,0L,300L,60L);
}
IORser=
(struct IOExtSer *)CreateExtIO(port,sizeof(struct IOExtSer));
if(IORser == NULL) {
quit=TRUE;
fubar=TRUE;
Response=AutoRequest(w,&IOErrTxt,
&QuitTxt,&QuitTxt,0L,0L,300L,60L);
}
open:
if ((error = OpenDevice(SERIALNAME,0,IORser,0))!=0) {
quit=TRUE;
fubar=TRUE;
Response=AutoRequest(w,&DevErrTxt,
&QuitTxt,&QuitTxt,0L,0L,300L,60L);
}
if((error=SetParams(IORser,rbl,rwl,wwl,brk,baud,sf,t0,t1))!=0){
fubar=TRUE;
quit=TRUE;
Response=AutoRequest(w,&PrmErrTxt,
&QuitTxt,&QuitTxt,0L,0L,300L,60L);
}
/* The serial device is open, so go ahead and play music.*/
}
int WriteSer(struct IOExtSer *io,char *data,int length)
{
int error;
struct IntuiText WrtErrTxt={2,1,JAM1,5,15,NULL,WrtErrStr,NULL};
io->IOSer.io_Data=(APTR)data;
io->IOSer.io_Length=length;
io->IOSer.io_Command=CMD_WRITE;
if((error=DoIO(io))!=0){
quit=TRUE;
fubar=TRUE;
Response=AutoRequest(w,&WrtErrTxt,
&QuitTxt,&QuitTxt,0L,0L,300L,60L);
}
return(error);
}
void PlayNoteOn(const struct NoteEvent *PlayEvent) {
extern int scale[];
/* Play a note; give note, dynamic*/
playbuffer[0]=(unsigned char)(PlayEvent->Channel | NOTEONCMD);
playbuffer[1]=(unsigned char)(scale[PlayEvent->Pitch]);
playbuffer[2]=(unsigned char)(PlayEvent->Dynamic);
WriteSer(IORser,playbuffer,3); /* send it out MIDI */
}
void PlayNoteOff(const struct NoteEvent *StopEvent) {
/* MIDI note off routine ; input is number of note */
extern int scale[];
playbuffer[0]=(unsigned char)(StopEvent->Channel | NOTEOFFCMD);
playbuffer[1]=(unsigned char)(StopEvent->CurPitch);
/* note number */
playbuffer[2]=0; /* zero dynamic */
WriteSer(IORser,playbuffer,3); /*send it out MIDI */
}
void SendFunction(int Function) {
playbuffer[1]=0;
switch (Function) {
case STARTFUNCT:
playbuffer[0]=(unsigned char)(START);
break;
case STOPFUNCT:
playbuffer[0]=(unsigned char)(STOP);
break;
case CLOCKFUNCT:
playbuffer[0]=(unsigned char)(TIMINGCLOCK);
break;
case CONTFUNCT:
playbuffer[0]=(unsigned char)(CONTINUE);
break;
}
WriteSer(IORser,playbuffer,1); /* send it out MIDI */
}
void StopAllNotes(const struct NoteEvent NotestoStop[]) {
int i;
for(i=0;i<16;i++) {
PlayNoteOff(&NotestoStop[i]);
if(fubar == TRUE) break;
}
SendFunction(STOPFUNCT);
}
void StopMIDI(void){
if (port) DeletePort(port);
if (IORser) CloseDevice(IORser);
}